About fs

fs  文件系统

  文件 I/O 是由简单封装的标准 POSIX 函数提供的。通过 require(‘fs’) 使用该模块。所有的方法都有异步和同步的形式。异步形式始终以完成回调作为它最后一个参数。 传给完成回调的参数取决于具体方法,但第一个参数总是留给异常。 如果操作成功完成,则第一个参数会是 null 或 undefined。当使用同步形式时,任何异常都会被立即抛出。 可以使用 try/catch 来处理异常,或让它们往上冒泡。(以下fs均以已经引进fs模块为前提)

常用函数

  • fs.readFile(filename,[options],callback);  读取文件
    filename, 必选参数,文件名
    [options] 可选参数,可指定flag(文件操作选项,如r+ 读写;w+读写,文件不存在则创建)及encoding属性
    callback 读取文件后的回调函数,参数默认第一个err,第二个data数据
  • fs.writeFile(filename,data,[options],callback);  写文件
    filename, 必选参数,文件名
    data, 写入的数据,可以字符或一个Buffer对象
    [options] [options],flag,mode(权限),encoding
    callback 读取文件后的回调函数,参数默认第一个err,第二个data数据
  • fs.appendFile(filename,data,[options],callback);  以追加方式写文件
    filename, 必选参数,文件名
    data, 写入的数据,可以字符或一个Buffer对象
    [options] [options],flag,mode(权限),encoding
    callback 读取文件后的回调函数,参数默认第一个err,第二个data数据
  • fs.open(filename, flags, [mode], callback);  打开文件
    filename, 必选参数,文件名
    flags, 操作标识,如”r”,读方式打开
    [mode],权限,如777,表示任何用户读写可执行
    callback 打开文件后回调函数,参数默认第一个err,第二个fd为一个整数,表示打开文件返回的文件描述符,window中又称文件句柄
  • fs.read(fd, buffer, offset, length, position, callback);  读文件,读取打开的文件内容到缓冲区中
    fd, 使用fs.open打开成功后返回的文件描述符
    buffer, 一个Buffer对象,v8引擎分配的一段内存
    offset, 整数,向缓存区中写入时的初始位置,以字节为单位
    length, 整数,读取文件的长度
    position, 整数,读取文件初始位置;文件大小以字节为单位
    callback(err, bytesRead, buffer), 读取执行完成后回调函数,bytesRead实际读取字节数,被读取的缓存区对象
  • fs.write(fd, buffer, offset, length, position, callback);  写文件,将缓冲区内数据写入使用fs.open打开的文件
    fd, 使用fs.open打开成功后返回的文件描述符
    buffer, 一个Buffer对象,v8引擎分配的一段内存
    offset, 整数,从缓存区中读取时的初始位置,以字节为单位
    length, 整数,从缓存区中读取数据的字节数
    position, 整数,写入文件初始位置;
    callback(err, written, buffer), 写入操作执行完成后回调函数,written实际写入字节数,buffer被读取的缓存区对象

  • fs.mkdir(path, [mode], callback);  创建目录
    path, 被创建目录的完整路径及目录名;
    [mode], 目录权限,默认0777
    [callback(err)], 创建完目录回调函数,err错误对象
  • fs.readdir(path, callback);  读取目录
    path, 要读取目录的完整路径及目录名;
    [callback(err, files)], 读完目录回调函数;err错误对象,files数组,存放读取到的目录中的所有文件名
  • fs.stat(path, callback);  查看文件与目录的信息
    path, 要查看目录/文件的完整路径及名;
    [callback(err, stats)], 操作完成回调函数;err错误对象,stat fs.Stat一个对象实例,提供如:isFile, isDirectory,isBlockDevice等方法及size,ctime,mtime等属性
  • fs.exists(path, callback);  查看文件与目录的是否存在
    path, 要读取目录的完整路径及目录名;
    [callback(exists)], 操作完成回调函数;exists true存在,false表示不存在
  • fs.rename(oldPath, newPath, callback);  移动/重命名文件或目录
    oldPath, 原目录/文件的完整路径及名;
    newPath, 新目录/文件的完整路径及名;如果新路径与原路径相同,而只文件名不同,则是重命名
    [callback(err)], 操作完成回调函数;err操作失败对象
  • fs.rmdir(path, callback);  删除空目录
    path, 目录的完整路径及目录名;
    [callback(err)], 操作完成回调函数;err操作失败对象

  • fs.utimes(path, atime, mtime, callback);  修改文件访问时间与修改时间
    path, 要查看目录/文件的完整路径及名;
    atime, 新的访问时间
    ctime, 新的修改时间
    [callback(err)], 操作完成回调函数;err操作失败对象
  • fs.utimes(path, mode, callback);  修改文件或目录的操作权限
    path, 要查看目录/文件的完整路径及名;
    mode, 指定权限,如:0666 8进制,权限:所有用户可读、写,
    [callback(err)], 操作完成回调函数;err操作失败对象

  • fs.watchFile(filename, [options], listener);  对文件进行监视,并且在监视到文件被修改时执行处理
    filename, 完整路径及文件名;
    [options], persistent true表示持续监视,不退出程序;interval 单位毫秒,表示每隔多少毫秒监视一次文件
    listener, 文件发生变化时回调,有两个参数:curr为一个fs.Stat对象,被修改后文件,prev,一个fs.Stat对象,表示修改前对象
  • fs.watch(filename, [options], [listener]);  对文件进行监视,并且在监视到文件被修改时执行处理
    filename, 完整路径及文件名或目录名;
    [listener(event, filename], 监听器事件,有两个参数:event 为rename表示指定的文件或目录中有重命名、删除或移动操作或change表示有修改,filename表示发生变化的文件路径
    fs.watch返回一个fs.FSWatcher对象,拥有一个close方法,用于停止watch操作;
    当fs.watch有文件变化时,会触发fs.FSWatcher对象的change(err, filename)事件,err错误对象,filename发生变化的文件名


文件流

  流,在应用程序中表示一组有序的、有起点有终点的字节数据的传输手段;Node.js中实现了stream.Readable/stream.Writeable接口的对象进行流数据读写;以上接口都继承自EventEmitter类,因此在读/写流不同状态时,触发不同事件;关于流读取:Node.js不断将文件一小块内容读入缓冲区,再从缓冲区中读取内容;关于流写入:Node.js不断将流数据写入内在缓冲区,待缓冲区满后再将缓冲区写入到文件中;重复上面操作直到要写入内容写写完;readFile、read、writeFile、write都是将整个文件放入内存而再操作,而则是文件一部分数据一部分数据操作;

  • 流读取
    • 读取数据对象:
      fs.ReadStream  读取文件
      http.IncomingMessage  客户端请求或服务器端响应
      net.Socket  Socket端口对象
      child.stdout  子进程标准输出
      child.stdin  子进程标准入
      process.stdin  用于创建进程标准输入流
      Gzip、Deflate、DeflateRaw  数据压缩
    • 触发事件:
      fs.ReadStream  读取文件
      data  数据读取后
      end  数据读取完成时
      error  数据读取错误时
      close  关闭流对象时
    • 读取数据的对象操作方法:
      read  读取数据方法
      setEncoding  设置读取数据的编
      pause  通知对象众目停止触发data事件
      resume  通知对象恢复触发data事件
      unpipe  取消通道
      unshift 当流数据绑定一个解析器时,此方法取消解析器
  • 流写入
    • 写数据对象:
      fs.WriteStream  写入文件对象
      http.clientRequest  写入HTTP客户端请求数据
      http.ServerResponse  写入HTTP服务器端响应数据
      net.Socket  读写TCP流或UNIX流,需要connection事件传递给用户
      child.stdout  子进程标准输出
      child.stdin  子进程标准入
      Gzip、Deflate、DeflateRaw  数据压缩
    • 写入数据触发事件:
      drain  当write方法返回false时,表示缓存区中已经输出到目标对象中,可以继续写入数据到缓存区
      finish  当end方法调用,全部数据写入完成
      pipe 当用于读取数据的对象的pipe方法被调用时
      error  数据读取错误时
      error  当发生错误
    • 写入数据方法:
      write  用于写入数据
      end  结束写入,之后再写入会报错;
  • 创建读取流
    fs.createReadStream(path, [options]);
    path 文件路径
    [options] flags:指定文件操作,默认’r’,读操作;encoding,指定读取流编码;autoClose, 是否读取完成后自动关闭,默认true;start指定文件开始读取位置;end指定文件开始读结束位置

    1
    2
    3
    4
    var rs = fs.createReadStream(__dirname + '/test.txt', {start: 0, end: 2});
    rs.on('open', function (fd) {
    console.log('messi is the best one');
    });
  • 创建写入流
    fs.createWriteStream(path, [options]);
    path 文件路径
    [options] flags:指定文件操作,默认’w’,;encoding,指定读取流编码;start指定写入文件的位置

    1
    2
    3
    4
    5
    var ws = fs.createWriteStream(__dirname + '/test.txt', {start: 0});
    var buffer = new Buffer('messi is the best one');
    ws.write(buffer, 'utf8', function (err, buffer) {
    console.log(arguments);
    });
  • 管道pipe实现流读写
    rs.pipe(destination, [options]);
    destination 必须一个可写入流数据对象
    [opations] end 默认为true,表示读取完成立即关闭文件;

    1
    2
    3
    4
    5
    6
    var rs = fs.createReadStream(__dirname + '/test/Until You.mp3');
    var ws = fs.createWriteStream(__dirname + '/test/untiyou.mp3');
    rs.pipe(ws);
    rs.on('data', function (data) {
    console.log('success')
    });


 渺小的搬运工  明明三省